package com.pond.pond.mapper;

import com.pond.pond.domain.FishingTechnique;
import com.pond.pond.domain.vo.FishingTechniqueVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 钓技文章Mapper接口
 * 
 * @author pond
 * @date 2024-01-15
 */
public interface FishingTechniqueMapper 
{
    /**
     * 查询钓技文章
     * 
     * @param id 钓技文章主键
     * @return 钓技文章
     */
    public FishingTechnique selectFishingTechniqueById(Long id);

    /**
     * 查询钓技文章详情（包含用户交互状态）
     * 
     * @param id 钓技文章主键
     * @param userId 用户ID
     * @return 钓技文章
     */
    public FishingTechniqueVo selectFishingTechniqueDetailById(@Param("id") Long id, @Param("userId") Long userId);

    /**
     * 查询钓技文章列表
     * 
     * @param fishingTechnique 钓技文章
     * @return 钓技文章集合
     */
    public List<FishingTechnique> selectFishingTechniqueList(FishingTechnique fishingTechnique);

    /**
     * 查询钓技文章列表（包含用户交互状态）
     * 
     * @param fishingTechnique 钓技文章
     * @param userId 用户ID
     * @return 钓技文章集合
     */
    public List<FishingTechniqueVo> selectFishingTechniqueListWithUser(@Param("technique") FishingTechnique fishingTechnique, @Param("userId") Long userId);

    /**
     * 新增钓技文章
     * 
     * @param fishingTechnique 钓技文章
     * @return 结果
     */
    public int insertFishingTechnique(FishingTechnique fishingTechnique);

    /**
     * 修改钓技文章
     * 
     * @param fishingTechnique 钓技文章
     * @return 结果
     */
    public int updateFishingTechnique(FishingTechnique fishingTechnique);

    /**
     * 删除钓技文章
     * 
     * @param id 钓技文章主键
     * @return 结果
     */
    public int deleteFishingTechniqueById(Long id);

    /**
     * 批量删除钓技文章
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteFishingTechniqueByIds(Long[] ids);

    /**
     * 增加阅读量
     * 
     * @param id 文章ID
     * @return 结果
     */
    public int incrementReadCount(Long id);

    /**
     * 增加点赞数
     * 
     * @param id 文章ID
     * @return 结果
     */
    public int incrementLikeCount(Long id);

    /**
     * 减少点赞数
     * 
     * @param id 文章ID
     * @return 结果
     */
    public int decrementLikeCount(Long id);

    /**
     * 增加收藏数
     * 
     * @param id 文章ID
     * @return 结果
     */
    public int incrementFavoriteCount(Long id);

    /**
     * 减少收藏数
     * 
     * @param id 文章ID
     * @return 结果
     */
    public int decrementFavoriteCount(Long id);

    /**
     * 增加评论数
     * 
     * @param id 文章ID
     * @return 结果
     */
    public int incrementCommentCount(Long id);

    /**
     * 减少评论数
     * 
     * @param id 文章ID
     * @return 结果
     */
    public int decrementCommentCount(Long id);

    /**
     * 查询热门文章
     * 
     * @param limit 数量限制
     * @param type 排序类型：read-阅读量，like-点赞数，favorite-收藏数
     * @return 文章列表
     */
    public List<FishingTechniqueVo> selectHotTechniques(@Param("limit") Integer limit, @Param("type") String type);

    /**
     * 查询用户收藏的文章列表
     * 
     * @param userId 用户ID
     * @return 文章列表
     */
    public List<FishingTechniqueVo> selectUserFavorites(Long userId);

    /**
     * 查询所有分类及其文章数量
     * 
     * @return 分类统计
     */
    public List<Map<String, Object>> selectCategoryStats();

    /**
     * 查询热门标签
     * 
     * @param limit 数量限制
     * @return 标签统计
     */
    public List<Map<String, Object>> selectHotTags(Integer limit);

    /**
     * 获取文章统计数据
     * 
     * @return 统计数据
     */
    public Map<String, Object> selectArticleStats();

    /**
     * 获取阅读趋势数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     */
    public List<Map<String, Object>> selectReadTrend(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取热门文章排行
     * 
     * @param type 排序类型
     * @param limit 数量限制
     * @return 热门文章
     */
    public List<Map<String, Object>> selectPopularArticles(@Param("type") String type, @Param("limit") Integer limit);

    /**
     * 获取用户活跃度统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 活跃度数据
     */
    public List<Map<String, Object>> selectUserActivityStats(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获取用户评论列表（包含文章标题）
     */
    List<Map<String, Object>> selectUserCommentsWithTechniqueTitle(@Param("userId") Long userId);
}